package com.itheima.d4_new;

import java.util.concurrent.FutureTask;

//目标：掌握线程的第三种创建方式-Callable、FutureTask接口实现
public class Demo03 {
    public static void main(String[] args) throws Exception {
        /**
         * FutureTask的API：
         *      FutureTask<>(Callable call)：把Callable对象封装成FutureTask对象
         *      V get()：获取线程执行call方法返回的结果
         *
         * 优点：
         *      线程任务类只是实现接口，可以继续继承类和实现接口，扩展性强
         *      可以在线程执行完毕后去获取线程执行的结果
         *
         * 缺点：编码复杂一点
         */
        //需求：使用多线程技术，让程序能同时做文件上传和文件下载的操作

        //1.定义一个类实现Callable接口，重写call方法，方法中放入线程要执行的代码（文件上传）

        //2.创建Callable对象之后，再创建FutureTask对象（线程任务对象），将Callable交给它
        MyCallable callable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(callable);

        //3.创建Thread线程对象，把FutureTask对象交给Thread
        Thread thread = new Thread(futureTask);

        //注意：FutureTask对象调用get方法获取结果，如果没有拿到，会将当前线程阻塞（卡死）
        //futureTask.get();

        //4.调用线程对象的start()方法开启线程
        thread.start();

        //5.主线程负责：文件下载
        for (int i = 0; i < 1000; i++) {
            System.out.println("文件下载：" + i);
        }

        //6.获取子线程执行结束后的结果，通过FutureTask对象的get方法可以拿到
        String result = futureTask.get();
        System.out.println("子线程执行结束的结果：" + result);
    }
}
